package modbus

import (
	"dcs/dcslog"
	"dcs/model"
	"fmt"
	"net"
	"strings"
	"time"
)

type Client struct {
	Conn net.Conn
}

var (
	Interval       time.Duration
	BootInterval   time.Duration
	NormalInterval time.Duration
	DoffInterval   time.Duration
)

func init() {
	NormalInterval = 5000
	DoffInterval = 3000
	BootInterval = 500
	Interval = NormalInterval
}

// HandleModbusConn 处理单个 机台的连接， 主控制逻辑
func (c *Client) HandleModbusConn() {

	defer c.Conn.Close()

	ipaddr := strings.Split(c.Conn.RemoteAddr().String(), ":")[0]
	fmt.Println("=== HandleModbusConn: " + ipaddr)
	dcslog.Logger.Println("=== HandleModbusConn: " + ipaddr)

	// 1 机台连接进来后， 首先读取机台配置， 原始数据和解析后数据，都保存到数据库表
	machine := c.SyncMachineConfig()

	var cur_status *model.Log_machine_status

	for {
		// 2 读取机台所有锭子 状态数据， 原始数据 保存到数据库表， 解析后数据返回
		spindleStatus := SyncAllSpindleStatus(c, machine)

		// 3 读取机台 状态数据，把所有锭子状态数据并入 原始数据和解析后数据都保存到数据库表，
		cur_status = c.SyncMachineStatus(machine, spindleStatus)

		// 判断 机台状态切换，调整采集频率
		// 1 从落纱状态 进入 运行状态，需要加大采集频率 - 0.5 秒钟采集一次，
		// 2 采集到 启动断头后要 回到正常采集频率 - 3秒钟采集一次
		// 3 从运行状态 进入 落纱状态，暂时 正常采集频率 - 0.5 秒钟采集一次
		if cur_status.Status == 1 && cur_status.Prestart != 0 {
			Interval = BootInterval
		} else if cur_status.Status == 0 {
			Interval = DoffInterval
		} else { // else if old_status.Status == 1 && cur_status.Run_state == 0
			Interval = NormalInterval
		}

		// 间隔 x 秒再检测
		time.Sleep(time.Millisecond * Interval)
	}
}
